package org.db.ui;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;

import javax.swing.table.AbstractTableModel;

import org.db.dao.BauwerkslinienDAO;

public class BauwerkslinienTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2730224940031320802L;

	private List<BauwerkslinienDAO> data = new ArrayList<BauwerkslinienDAO>();

	private DecimalFormat format1 = new DecimalFormat("0.000");

	Class<?>[] types = new Class[]{java.lang.Double.class,
			java.lang.Double.class, java.lang.String.class,
			java.lang.Double.class, java.lang.String.class};

	@Override
	public int getColumnCount() {
		return 5;
	}

	@Override
	public int getRowCount() {
		return data.size();
	}

	@Override
	public Object getValueAt(int row, int column) {
		switch (column) {
			case 0 :
				return format1.format(data.get(row)
						.getStationierungVonInMeter());
			case 1 :
				return data.get(row).getStationierungBisInMeter() == 0
						? ""
						: format1.format(data.get(row)
								.getStationierungBisInMeter());
			case 2 :
				return data.get(row).getBauwerk();
			case 3 :
				return data.get(row).getHoeheInMeter() == 0 ? "" : format1
						.format(data.get(row).getHoeheInMeter());
			case 4 :
				return data.get(row).getBesonderheiten();
			default :
				return "";
		}
	}

	@Override
	public void setValueAt(Object value, int rowIndex, int columnIndex) {
		BauwerkslinienDAO dao = data.get(rowIndex);
		switch (columnIndex) {
			case 0 :
				dao.setStationierungVonInMeter((Double) value);
				break;
			case 1 :
				dao.setStationierungBisInMeter((Double) value);
				break;
			case 2 :
				dao.setBauwerk((String) value);
				break;
			case 3 :
				dao.setHoeheInMeter((Double) value);
				break;
			case 4 :
				dao.setBesonderheiten((String) value);
				break;
		}
		fireTableCellUpdated(rowIndex, columnIndex);
	}

	@Override
	public String getColumnName(int column) {
		switch (column) {
			case 0 :
				return "Stationierung von";
			case 1 :
				return "Stationierung bis";
			case 2 :
				return "Bauwerk";
			case 3 :
				return "Höhe Bauwerk";
			case 4 :
				return "Besonderheiten";
			default :
				return "";
		}
	}

	@Override
	public boolean isCellEditable(int row, int column) {
		return false;
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return types[columnIndex];
	}

	public void addBauwerkslinienElement(BauwerkslinienDAO dao) {
		data.add(dao);
		Collections.sort(data);
		fireTableDataChanged();
	}

	public void addBauwerkslinienElemente(SortedSet<BauwerkslinienDAO> daos) {
		data.addAll(daos);
		fireTableDataChanged();
	}

	public List<BauwerkslinienDAO> getBauwerksLinienElemente() {
		return data;
	}

	public BauwerkslinienDAO getElementAtRow(int row) {
		if (row < data.size()) {
			return data.get(row);
		}
		return null;
	}

	public void replaceBauwerkslinienElement(BauwerkslinienDAO oldDao,
			BauwerkslinienDAO newDao) {
		data.set(data.indexOf(oldDao), newDao);
		fireTableDataChanged();
	}

	public void removeBauwerkslinienElement(BauwerkslinienDAO dao) {
		data.remove(dao);
		fireTableDataChanged();
	}

	public List<BauwerkslinienDAO> getBauwerklinienElemente() {
		return data;
	}

	public BauwerkslinienDAO removeBauwerkslinienElement(int rowIndex) {
		BauwerkslinienDAO removedDAO = data.remove(rowIndex);
		fireTableDataChanged();
		return removedDAO;
	}

	public void refresh() {
		fireTableDataChanged();
	}

	public boolean isEmpty() {
		return data.isEmpty();
	}

}
